GtkFontChooserWidget: Listen for fontconfig changes
authorMatthias Clasen <mclasen@redhat.com>
Wed, 6 May 2015 04:52:23 +0000 (00:52 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 6 May 2015 04:52:23 +0000 (00:52 -0400)
We were relying on indirectly getting notify when fontconfig
configuration changes, by GtkSettings translating the timestamp
change into a style-invalidation, which gets fed through the
css invalidation machinery. That machinery has gotten good enough
at optimizing away redundant changes that it no longer emits
::style-updated in this case.

So, instead make the font chooser listen directly to what it
cares about: the fontconfig change notification from GtkSettings.

gtk/gtkfontchooserwidget.c

index 9e22fbc277afe19e65ca17e9c542846c7edfc876..a991702fc1d0feeff8adb01bf00e8ef965f4ff97 100644 (file)
@@ -46,6 +46,7 @@
 #include "gtktreeselection.h"
 #include "gtktreeview.h"
 #include "gtkwidget.h"
+#include "gtksettings.h"
 
 /**
  * SECTION:gtkfontchooserwidget
@@ -96,6 +97,7 @@ struct _GtkFontChooserWidgetPrivate
   gpointer          filter_data;
   GDestroyNotify    filter_data_destroy;
 
+  GtkSettings *settings;
   guint last_fontconfig_timestamp;
 };
 
@@ -953,10 +955,20 @@ gtk_font_chooser_widget_screen_changed (GtkWidget *widget,
                                         GdkScreen *previous_screen)
 {
   GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (widget);
+  GtkSettings *settings;
 
   if (GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->screen_changed)
     GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->screen_changed (widget, previous_screen);
 
+  if (previous_screen)
+    {
+      settings = gtk_settings_get_for_screen (previous_screen);
+      g_signal_handlers_disconnect_by_func (settings, gtk_font_chooser_widget_load_fonts, widget);
+    }
+  settings = gtk_widget_get_settings (widget);
+  g_signal_connect_object (settings, "notify::gtk-fontconfig-timestamp",
+                           G_CALLBACK (gtk_font_chooser_widget_load_fonts), widget, G_CONNECT_SWAPPED);
+
   if (previous_screen == NULL)
     previous_screen = gdk_screen_get_default ();